package com.hblack.manage.service;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.github.abel533.entity.Example;
import com.github.abel533.mapper.Mapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hblack.manage.pojo.BasePojo;

public abstract class BaseService<T extends BasePojo> {

	@Autowired
	private Mapper<T> mapper;
	
	/**
	 * 根据ID查询实体
	 * @param id
	 * @return
	 */
	public T queryById(Long id) {
		
		return mapper.selectByPrimaryKey(id);
	}
	
	/**
	 * 查询所有
	 * @return
	 */
	public List<T> queryAll(){
		
		return mapper.select(null);
	}
	
	/**
	 * 根据条件查询一个实体
	 * @param t
	 * @return
	 */
	public T queryOne(T t){
		
		return mapper.selectOne(t);
	}
	
	/**
	 * 根据条件查询list集合
	 * @param t
	 * @return
	 */
	public List<T> queryListByWhere(T t){
		
		return mapper.select(t);
	}
	
	/**
	 * 根据条件分页查询
	 * @param t
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	public PageInfo<T> queryPageByWhere(T t,Integer pageNum, Integer pageSize){
		
		
		PageHelper.startPage(pageNum, pageSize);		//开启分页
		List<T> list = mapper.select(t);
		PageInfo<T> pageInfo = new PageInfo<>(list); 	//将查询数据添加至分页信息
		return pageInfo;
	}
	
	/**
	 * 添加实体
	 * @param t
	 * @return
	 */
	public Integer save(T t){
		
		t.setCreated(new Date());		//在保存时设置保存时间
		t.setUpdated(t.getCreated());	//设置更新时间，添加时，更新与保存时间一直
		
		return mapper.insertSelective(t);
	}
	
	/**
	 * 根据主键更新实体
	 * @param t
	 * @return
	 */
	
	public Integer updateByPrimaryKey(T t){
		
		t.setUpdated(new Date());	
		t.setCreated(null);			//清空创建时间,不需要更新
		
		return mapper.updateByPrimaryKeySelective(t);
	}
	
	/**
	 * 根据ID删除实体
	 * @param id
	 * @return
	 */
	public Integer deleteById(Object id){
		
		return mapper.deleteByPrimaryKey(id);
	}
	
	/**
	 * 根据对个ID删除多个实体
	 * @param clazz
	 * @param property
	 * @param ids
	 * @return
	 */
	public Integer deleteByIds(Class<T> clazz, String property,List<Object> ids){
		
		Example example = new Example(clazz);
		example.createCriteria().andIn(property, ids);
		return mapper.deleteByExample(example);
	}
	
	/**
	 * 根据条件删除多条记录
	 * @param t
	 * @return
	 */
	public Integer deleteByWhere(T t){
		
		return mapper.delete(t);
	}
}
